package com.sprouting.personal.model.entity;

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.sprouting.personal.annotations.CheckLength;
import com.sprouting.personal.annotations.CheckNotNull;
import com.sprouting.personal.model.common.BaseModel;
import com.sprouting.personal.model.common.jsr.AddGroup;
import com.sprouting.personal.model.common.jsr.UpdGroup;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;
import java.util.Date;

/**
 * 家庭成员信息表
 *
 * @author ：LX（长沙麓谷）
 * @date 创建时间： 2022/7/26 1:20
 */
@Data
@TableName("ps_member_family")
public class MemberFamily extends BaseModel {

    /**
     * 主键,隶属登录用户
     * 当非创建人时候，这个ID则与 user.id 是不同的
     * @see User#getId() 和它的ID是一样的
     */
    @TableId
    @CheckNotNull(message = "非法ID", groups = UpdGroup.class)
    @Null(message = "无效ID", groups = AddGroup.class)
    private String id;
    /**
     * 隶属用户
     * @see User#getId() 和它的ID是一样的
     */
    private String userId;
    /**
     * 真实姓名
     * @see com.sprouting.personal.interfaces.common.Constant.DefaultValue#UNKNOWN_NAME 默认数据
     */
    @CheckLength(max = 50, message = "真实姓名超过长度限制")
    private String userName;
    /**
     * 外号，昵称
     */
    @CheckLength(max = 30, message = "外号/昵称超过长度限制")
    private String nickname;
    /**
     * 人物的外貌特征
     */
    @CheckLength(max = 500, message = "人物的外貌特征超过长度限制")
    private String features;
    /**
     * 手机号码，多个逗号分隔
     */
    @CheckLength(max = 80, message = "手机号码超过长度限制")
    private String phone;
    /**
     * 身份证
     */
    private String idCard;
    /**
     * 性别-未传则根据身份证获取，默认身份证获取
     * @see com.sprouting.personal.interfaces.common.Constant.Sex
     */
    private Integer sex;
    /**
     * 真实出生年月类型-阴历还是阳历
     * 不填则从身份证上获取，输入则以输入的为准，防止实际出生年月与身份证不符的情况，该数据只参与年龄计算，与生日无关
     * @see com.sprouting.personal.interfaces.common.Constant.Calendar
     */
    private Integer lunarCalendar;
    /**
     * 真实出生年月(出生) 记录出生时间，可以是任意格式，年月日
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8")
    private String birth;
    /**
     * 生日提醒时间(实际生日时间),因为数据库不支持月日的，只好转换为字符串
     * 每年生日时间-实际生日时间，只有日期，都会转为阴历，并且特殊年份还会进行特别转换，月和日
     */
    @DateTimeFormat(pattern = "MM-dd")
    @JsonFormat(pattern="MM-dd")
    private String birthdayTime;
    /**
     * 生日多久之前提醒
     */
    private Integer beforeBirthday;
    /**
     * 是否开启生日提醒
     * @see com.sprouting.personal.interfaces.common.Constant.YesOrNo#YES 开启生日提醒
     */
    private Integer birthdayTips;
    /**
     * 头像地址-相对路径
     */
    private String icoPath;
    /**
     * 职业
     */
    @CheckLength(max = 30, message = "职业信息超过长度限制")
    private String occupation;
    /**
     * 公司名称
     */
    @CheckLength(max = 180, message = "公司名称超过长度限制")
    private String companyName;
    /**
     * 公司地址
     */
    @CheckLength(max = 300, message = "公司地址超过长度限制")
    private String companyAddress;
    /**
     * 工作行业
     */
    @CheckLength(max = 150, message = "工作行业超过长度限制")
    private String trade;
    /**
     * 最高学历毕业学校
     */
    @CheckLength(max = 150, message = "最高学历毕业学校信息超过长度限制")
    private String graduationSchool;
    /**
     * 健康情况
     */
    @CheckLength(max = 900, message = "健康情况超过长度限制")
    private String health;
    /**
     * 学历
     */
    @CheckLength(max = 50, message = "学历信息超过长度限制")
    private String education;
    /**
     * 居住地址,现在的居住地址直接中文会更好一点
     */
    @CheckLength(max = 700, message = "居住地址超过长度限制")
    private String residentialAddress;
    /**
     * 老家地址-同居住地址前端控制
     */
    @CheckLength(max = 500, message = "老家地址超过长度限制")
    private String residentialAddressHometown;
    /**
     * 老家经度
     */
    private String hometownLongitude;
    /**
     * 老家纬度
     */
    private String hometownLatitude;
    /**
     * 老家经纬转中文
     */
    private String hometownLongitudeLatitudeText;
    /**
     * 老家照片
     */
    private String hometownIcoPath;
    /**
     * 结婚时间
     */
    @CheckLength(max = 25, message = "结婚时间超过长度限制")
    private String marryTime;
    /**
     * 离世时间,存在离世时间就是已经过世
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8")
    private Date deathTime;
    /**
     * 陵墓说明,可能包括墓碑的名字等信息
     */
    private String tombExplanation;
    /**
     * 陵墓经度
     */
    private String tombLongitude;
    /**
     * 陵墓纬度
     */
    private String tombLatitude;
    /**
     * 陵墓经纬度转中文
     */
    private String tombLongitudeLatitudeText;
    /**
     * 陵墓照片
     */
    private String tombIcoPath;
    /**
     * 车牌
     */
    @CheckLength(max = 15, message = "车牌超过长度限制")
    private String licensePlate;
    /**
     * 备注
     */
    @CheckLength(max = 2000, message = "备注超过长度限制")
    private String remarks;
    /**
     * 排序
     * @see com.sprouting.personal.interfaces.common.Constant.DefaultValue#SORT 默认值
     */
    private Double sort;
}
